package com.atguigu.gmall.item.biz.impl;

import com.alibaba.fastjson.JSON;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.item.biz.SkuDetailBizService;
import com.atguigu.gmall.item.feigns.product.SkuDetailFeignClient;
import com.atguigu.gmall.product.entity.SkuInfo;
import com.atguigu.gmall.product.entity.SpuSaleAttr;
import com.atguigu.gmall.web.vo.AttrValueConcatVo;
import com.atguigu.gmall.web.vo.CategoryView;
import com.atguigu.gmall.web.vo.SkuDetailVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class SkuDetailBizServiceImpl implements SkuDetailBizService {

    @Autowired
    private SkuDetailFeignClient skuDetailFeignClient ;

    @Override
    public SkuDetailVo skuDetailBySkuId(Long skuId) {

        // 创建SkuDetailVo对象封装数据
        SkuDetailVo skuDetailVo = new SkuDetailVo() ;

        // 根据skuId的查询其所对应的三级分类的数据
        Result<CategoryView> categoryViewResult = skuDetailFeignClient.findByCategoryBySkuId(skuId);
        CategoryView categoryView = categoryViewResult.getData();
        skuDetailVo.setCategoryView(categoryView);

        // 调用product微服务的根据skuId查询skuInfo数据以及图片数据
        Result<SkuInfo> skuInfoResult = skuDetailFeignClient.findBySkuInfoAndSkuImagesBySkuId(skuId);
        SkuInfo skuInfo = skuInfoResult.getData();
        skuDetailVo.setSkuInfo(skuInfo);

        // 远程调用product微服务的接口查询价格数据
        Result<SkuInfo> infoResult = skuDetailFeignClient.findSkuInfoBySkuId(skuId);
        SkuInfo infoResultData = infoResult.getData();
        skuDetailVo.setPrice(infoResultData.getPrice());

        // 远程调用product微服务的接口查询spu的销售属性和销售属性的值
        Result<List<SpuSaleAttr>> spuSalAttrResult = skuDetailFeignClient.findSpuSalAttrBySkuId(skuId);
        List<SpuSaleAttr> spuSalAttrResultData = spuSalAttrResult.getData();
        skuDetailVo.setSpuSaleAttrList(spuSalAttrResultData);

        // 远程调用product微服务，根据skuId获取所有的兄弟sku的销售属性值的组合
        Result<List<AttrValueConcatVo>> brotherSkuSaleAttrValueConcatBySkuId = skuDetailFeignClient.findBrotherSkuSaleAttrValueConcatBySkuId(skuId);
        List<AttrValueConcatVo> valueConcatVoList = brotherSkuSaleAttrValueConcatBySkuId.getData();

        // Collectors.toMap将流中的元素转换成Map，方法的第一个参数是用来构建Map的键，方法的第二个参数是用来构建Map的值
        Map<String, Long> map = valueConcatVoList.stream().
                collect(Collectors.toMap(attrValueConcatVo -> attrValueConcatVo.getAttrValueConcat(), attrValueConcatVo -> attrValueConcatVo.getSkuId()));
        String valuesSkuJson = JSON.toJSONString(map);
        skuDetailVo.setValuesSkuJson(valuesSkuJson);

        // 返回
        return skuDetailVo;
    }

}
